﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using vudu.ClasesDominio;
using vudu.Datos.Fachada;
using vudu.Datos.SqlServer;

namespace vudu.Logica.Clases
{
    public class ControladorPractica
    {
        #region Atributos

            private Practica _practica;
            private EnlaceDatos _fachada;

            private List<HorarioDeClase> _listaHorarioProfesor;            
            private List<List<HorarioDeClase>> _listaHorarioSalon;

        #endregion
    
        #region Constructor

        public ControladorPractica()
        {
            _practica = new Practica();
            _fachada = new EnlaceDatos();
            _listaHorarioProfesor = new List<HorarioDeClase>();
            _listaHorarioSalon = new List<List<HorarioDeClase>>();

        }

        #endregion

        #region Gets y Sets

        public Practica practica
        {
            get { return _practica; }
            set { _practica = value; }
        }

        public List<HorarioDeClase> ListaHorarioProfesor
        {
            get { return _listaHorarioProfesor; }
            //set { _listaHorarioProfesor = value; }
        }
        public List<List<HorarioDeClase>> ListaHorarioSalon
        {
            get { return _listaHorarioSalon; }
            //set { _listaHorarioSalon = value; }
        }

        public EnlaceDatos fachadaDatos
        {
            get { return _fachada; }
        }

        #endregion

        #region Metodos de ControladorPractica

        public List<Materia> ObtenerMateriasActivasConSeccTeoria(string nombreEscuela)
        {
            return fachadaDatos.ObtenerMateriasActivasConSeccTeoria(nombreEscuela);
        }

        public List<SeccionMateria> ArmarListaDeSeccionesDisponibles(int idEscuela, int idMateria)
        {
            return fachadaDatos.ListaSeccionesMateria(idEscuela, idMateria);
        }

        public Escuela ArmarEscuela(string correoEscuela)
        {
            return fachadaDatos.ArmarEscuela(correoEscuela);
        }

        public List<Profesor> ConsultarProfesores(int idEscuela)
        {
            return fachadaDatos.ListaProfesores(idEscuela);
        }


        public void CrearPractica(Practica practica, int idSeccionMateria, List<HorarioDeClase> horario,List<Salon> salones)
        {
            practica.IdPractica = fachadaDatos.UltimoIdPractica()+1;
            practica.statusPractica = "Activo";
            fachadaDatos.AgregarPractica(practica, idSeccionMateria);

            for (int i = 0; i < horario.Count; i++)
            {
                horario[i].SalonDeClase.NumeroSalon = salones[i].NumeroSalon;
                fachadaDatos.AgregarHorarioClase(horario[i],practica.IdPractica);
            }
            
                        
        }

        public bool ValidarNombrePractica(int  numeroSeccionMateria ,String nombreSeccionPractica)
        {
            bool encontrado = fachadaDatos.VerificarNombrePractica(nombreSeccionPractica, numeroSeccionMateria);

            if (encontrado == true)
            { return false; }
            else
            { return true; }
        }

        public bool ValidarSeccionPractica(int numeroSeccionMateria, int numeroSeccionPractica)
        {
            bool encontrado = fachadaDatos.VerificarSeccionPractica(numeroSeccionPractica, numeroSeccionMateria);

            if (encontrado == true)
            { return false; }
            else
            { return true; }
        }

        public void ChoqueHorarioProfesorSalon(int idEscuela, string nombreEscuela, int idProfesor)
        {
            List<HorarioDeClase> listaHorarioProfesor = new List<HorarioDeClase>();
            List<Materia> listaMateria = new List<Materia>();
            List<SeccionMateria> listaSeccionMateria = new List<SeccionMateria>();

            //listaProfesor = _fachada.ListaProfesores(idEscuela);
            listaMateria = _fachada.ObtenerMateriasActivasConSeccTeoria(nombreEscuela);

            // RECORRO LA LISTA DE MATERIAS EN BUSCA DE SUS SECCIONESMATERIAS CON SUS PRACTICAS LLENAS
            for (int contador = 0; contador < listaMateria.Count(); contador++)
            {
                List<SeccionMateria> misSeccionMateria = new List<SeccionMateria>();
                misSeccionMateria = _fachada.ListaSeccionesMateria(idEscuela, listaMateria[contador].Codigo);

                // RECORRO LA LISTA DE SECIONESMATERIA DE LA MATERIA
                for (int contador1 = 0; contador1 < misSeccionMateria.Count(); contador1++)
                {

                    // COMPARO LAS CEDULAS DEL PROFESOR CON EL PROFESOR DE LA SECCIONMATERIA
                    if (misSeccionMateria[contador1].Profesor.Cedula == idProfesor)
                    {

                        // RECORRO CADA HORARIO QUE POSEE misSeccionMateria PARA AGREGARLA A LA LISTA
                        for (int contador2 = 0; contador2 < listaSeccionMateria[contador1].HorasClase.Count(); contador2++)
                        {
                            listaHorarioProfesor.Add(listaSeccionMateria[contador1].HorasClase[contador2]);
                        }
                    }

                    // RECORRO LA LISTA DE LAS PRACTICAS DE CADA SECCION MATERIA
                    for (int contador3 = 0; contador3 < listaSeccionMateria[contador1].ListaPractica.Count(); contador3++)
                    {

                        // COMPRARO LA CEDULA DEL PROFESOR CON LA CEDULA DEL PROFESOR DE LA PRACTICA DE LA SECCIONMATERIA
                        if (listaSeccionMateria[contador1].ListaPractica[contador3].profesor.Cedula == idProfesor)
                        {

                            // RECORRO LA LISTA DE HORARIO DE LA PRACTICAS DE CADA SECCION MATERIA AGREGANDO A LA LISTAHORARIOPROFESOR
                            for (int contador4 = 0; contador4 < listaSeccionMateria[contador1].ListaPractica[contador3].horarioDeClase.Count(); contador4++)
                            {

                                listaHorarioProfesor.Add(listaSeccionMateria[contador1].HorasClase[contador4]);

                            }

                        }

                    }

                }

            }

            // GLOBALIZO LA LISTA DE HORARIOS DEL PROFESOR
            _listaHorarioProfesor = listaHorarioProfesor;

            // RECORRO LA LISTA DE SECIONESMATERIA DE LA MATERIA
            for (int contador = 0; contador < listaSeccionMateria.Count(); contador++)
            {

                SeccionMateria seccionActual = new SeccionMateria();
                seccionActual = listaSeccionMateria[contador];

                // RECORRO LA LISTA DE HORARIOS DE LA SECCION MATERIA
                for (int contador1 = 0; contador1 < seccionActual.HorasClase.Count(); contador1++)
                {
                    
                    HorarioDeClase horarioActual = new HorarioDeClase();
                    horarioActual = seccionActual.HorasClase[contador1];

                    // VERIFICO SI EL horarioActual ESTA EN LA LISTA GLOBAL DE HORARIOS SALONES, SI NO ES ASI, AGREGO UNA LISTA NUEVA
                    if (!ExisteEnLista(horarioActual.SalonDeClase.NumeroSalon))
                    {

                        List<HorarioDeClase> horarioNuevo = new List<HorarioDeClase>();
                        horarioNuevo.Add(horarioActual);

                        _listaHorarioSalon.Add(horarioNuevo);

                    }

                    // SINO, ES PORQUE ESTA, RECORRO LA LISTA GLOBAL EN BUSCA DE LA POSICION DEL SALON  PARA AGREGARLA A SU LISTA
                    else
                    { 
                    
                        // RECORRO LISTA GLOBAL DE HORARIOS POR SALON
                        for (int contador2 = 0 ; contador2 < _listaHorarioSalon.Count(); contador2++)
                        {
                        
                            List<HorarioDeClase> subListaHorario = new List<HorarioDeClase>();
                            subListaHorario = _listaHorarioSalon[contador2];

                            // PREGUNTO SI EL NOMBRE DEL SALON ES EL DE LA POSICION ACTUAL, SI ES ASI AGREGO A LA LISTA, SINO DEJO RECORRER
                            if (horarioActual.SalonDeClase.NumeroSalon == subListaHorario[0].SalonDeClase.NumeroSalon)
                            {

                                subListaHorario.Add(horarioActual);
                            
                            }
                        }
                    
                    }
                }
            }

        }

        public bool ExisteEnLista( int numeroSalon )
        {

            bool bandera = false;

            for (int contador = 0; contador < _listaHorarioSalon.Count(); contador++ )
            { 
                List<HorarioDeClase> subListaHorarios = new List<HorarioDeClase>();
                subListaHorarios = _listaHorarioSalon[contador];

                HorarioDeClase horarioActual = new HorarioDeClase();
                horarioActual = subListaHorarios[0];

                if ( horarioActual.SalonDeClase.NumeroSalon == numeroSalon )
                {
                    bandera = true;
                }
            
            }

            return bandera;
        }

        //public void ModificarSalonPractica(int idPractica,string dia,string salon)
        //{
        //    fachadaDatos.ModificarSalon(idPractica, dia, Convert.ToInt32(salon));
        //}

        //public void ModificarHorarioPractica(DateTime horaInicio,DateTime horaFin,string dia,int idPractica)
        //{
        //    fachadaDatos.ModificarHorarioPractica(horaInicio,horaFin,dia,idPractica);
        //}
        
        //public void EliminarSeccionPractica(int numeroSeccion)
        //{
        //}
        
        //public void ConsutarSeccionPractica(int numeroSeccionPractica)
        //{
        //}
        
        //public void AsignarHorario(DateTime inicio,DateTime fin,DateTime fecha)
        //{
            
        //}
        
        //public void ConsultarHorario(DateTime inicio, DateTime fin, DateTime fecha)
        //{
        //}
        
        //public void SolicitarProfesor()
        //{
        //}

        #endregion
        
    }
}
